[アップデート] IAM ポリシーと SCP でベストプラクティスに則れ! IAM Access Analyzer が新機能「ポリシーチェック」に対応しました
コンバンハ、千葉(幸)です。
IAM Access Analyzer によるポリシーチェックが可能になりました。
これまでアクセスアナライザーによる分析対象としてリソースベースポリシーがサポートされていたのですが、今回の新機能では IAM ポリシーと SCP(サービスコントロールポリシー)に対するチェックができるようになっています。
何が変わったのか
従来のアクセスアナライザーができたのは「リソースベースポリシーが外部からアクセス可能なパーミッションになっていないか」の検証でした。
現時点でサポートされているリソースタイプは以下の通りで、これらに対してアカウント外(もしくはOrganizations外)のプリンシパルからのアクセスが可能となっていないかを、自動的にチェックしてくれます。
- S3 バケット
- IAM ロール
- KMS キー
- Lambda 関数とレイヤー
- SQS キュー
- Secrets Manager シークレット
基本的にはすでに存在するパーミッション(リソースベースポリシーで定義された許可)に対するチェックなのですが、先日のアップデートで「事前の検証」にも対応しました。
今回のアップデートによる新機能では、リソースベースポリシーでなく IAM ポリシーと SCP に対するチェックに対応しています。
例えば以下は IAM ポリシーの JSON での編集画面ですが、画面下部にチェック結果を表示してくれる箇所が追加されています。
編集中のポリシーの内容に対して、概ねリアルタイムで以下の観点でのチェック結果を表示してくれます。
- セキュリティ
- エラー
- 警告
- 提案
すべてのチェック結果への対応がマストというわけではありませんが、チェック結果に合わせて修正することでベストプラクティスに近づいていけるようになっています。
従来のリソースベースポリシーに対する分析には「アナライザー」の作成が必要ですが、新機能「ポリシーチェック」ではその必要はありません。特に追加設定なしでそのまま使い始められます。無料です。
100を超すチェック項目
どういったチェックをしてくれるかは、以下ページに記載があります。
現時点で107個あり、今後も随時追加されていくとのことです。
ものすごく粗いですが、ざっくりまとめてみました。(項目名が重複する物もあります)
分類 | 項目 | 概要 |
---|---|---|
Error | ARN account not allowed | 許可されていないARNアカウント |
Error | ARN Region not allowed | 許可されていないARNリージョン |
Error | Data type mismatch | データ型の不一致 |
Error | Duplicate keys with different case | 大文字と小文字が異なる重複キー |
Error | Invalid action | 無効なアクション |
Error | Invalid ARN account | 無効なARNアカウント |
Error | Invalid ARN prefix | 無効なARNプレフィックス |
Error | Invalid ARN Region | 無効なARNリージョン |
Error | Invalid ARN resource | 無効なARNリソース |
Error | Invalid ARN service case | 無効なARNサービスケース |
Error | Invalid condition data type | 無効な条件・データ型 |
Error | Invalid condition key format | 無効な条件・キー形式 |
Error | Invalid condition multiple Boolean | 無効な条件・複数のブール値 |
Error | Invalid condition operator | 無効な条件・演算子 |
Error | Invalid effect | 無効なエフェクト |
Error | Invalid global condition key | 無効なグローバル条件キー |
Error | Invalid partition | 無効なパーティション |
Error | Invalid policy element | 無効なポリシー要素 |
Error | Invalid principal format | 無効なプリンシパルフォーマット |
Error | Invalid principal key | 無効なプリンシパルキー |
Error | Invalid Region | 無効なリージョン |
Error | Invalid service | 無効なサービス |
Error | Invalid service condition key | 無効なサービス条件キー |
Error | Invalid service in action | アクション内の無効なサービス |
Error | Invalid variable for operator | 無効な演算子の変数 |
Error | Invalid version | 無効なバージョン |
Error | Json syntax error | Json構文エラー |
Error | Json syntax error | Json構文エラー |
Error | Missing action | アクションが不足 |
Error | Missing ARN field | ARNフィールドが不足 |
Error | Missing ARN Region | ARNリージョンが不足 |
Error | Missing effect | 効果が不足 |
Error | Missing principal | プリンシパルが不足 |
Error | Missing qualifier | 修飾子が不足 |
Error | Missing resource | リソースが不足 |
Error | Missing statement | ステートメントが不足 |
Error | Null with if exists | IfExistsとNullの同時使用 |
Error | SCP syntax error action wildcard | SCP構文エラー・アクション内でのワイルドカード |
Error | SCP syntax error allow condition | SCP構文エラー・AllowとConditionの使用 |
Error | SCP syntax error allow NotAction | SCP構文エラー・NotActionの使用 |
Error | SCP syntax error allow resource | SCP構文エラー・Allowとリソース指定 |
Error | SCP syntax error NotResource | SCP構文エラー・NotResourceの使用 |
Error | SCP syntax error principal | SCP構文エラー・プリンシパルの使用 |
Error | Unique Sids required | 固有のSidが必要 |
Error | Unsupported element combination | サポートされていない要素の組み合わせ |
Error | Unsupported global condition key | サポートされていないグローバル条件キー |
Error | Unsupported principal | サポートされていないプリンシパル |
Error | Unsupported Sid | サポートされていないSid |
Error | Unsupported wildcard in principal | プリンシパル要素でのサポートされていないワイルドカード |
Error | Missing brace in variable | 変数に中括弧{}がない |
Error | Unsupported symbol in variable | 変数でサポートされていないシンボル |
Error | Unsupported symbol in variable | 変数でサポートされていないシンボル |
Error | Missing quote in variable | 変数に引用符がない |
Error | Unsupported space in variable | 変数でサポートされていないスペース |
Error | Empty variable | 空の変数 |
Error | Variable unsupported in element | 要素でサポートされていない変数 |
Error | Variable unsupported in version | ポリシーバージョンでサポートされていない変数 |
Error | Private IP address | aws:SourceIpでプライベートIPアドレスを指定 |
Error | Private NotIpAddress | aws:SourceIpのNotIpAddressでプライベートIPアドレスを指定 |
Error | Policy size exceeds SCP quota | ポリシーサイズがSCPクォータを超えている |
General Warning | Create SLR with NotResource | NotResourceを使用したSLR(ServiceLinkedRole)の作成 |
General Warning | Create SLR with star in action and NotResource | アクションとNotResourceにワイルドカードを使用したSLRの作成 |
General Warning | Create SLR with NotAction and NotResource | NotActionとNotResourceを使用したSLRの作成 |
General Warning | Create SLR with star in resource | リソースでワイルドカードを使用したSLRの作成 |
General Warning | Create SLR with star in action and resource | アクションとリソースにワイルドカードを使用したSLRの作成 |
General Warning | Create SLR with star in resource and NotAction | リソースとNotActionにワイルドカードを使用したSLRの作成 |
General Warning | Deprecated global condition key | 非推奨のグローバル条件キー |
General Warning | Invalid date value | 無効な日付値 |
General Warning | Invalid role reference | 無効なIAMロール参照 |
General Warning | Invalid user reference | 無効なIAMユーザー参照 |
General Warning | Missing version | バージョンが指定されていない |
General Warning | Unique Sids recommended | 一意なSidの推奨 |
General Warning | Wildcard without like operator | Like演算子使用時にワイルドカードを使用しない |
General Warning | Policy size exceeds identity policy quota | ポリシーサイズがクォータを超えている |
General Warning | Type mismatch | タイプの不一致 |
General Warning | Type mismatch Boolean | タイプの不一致・ブール値 |
General Warning | Type mismatch date | タイプの不一致・日付 |
General Warning | Type mismatch IP range | タイプの不一致・IP範囲 |
General Warning | Type mismatch number | タイプの不一致・数値 |
General Warning | Type mismatch string | タイプの不一致・文字列 |
Security Warning | Allow with NotPrincipal | NotPrincipalで許可 |
Security Warning | ForAllValues with single valued key | 単一値のキーを持つForAllValues |
Security Warning | Pass role with NotResource | NotResourceでPassRole |
Security Warning | Pass role with star in action and NotResource | アクションとNotResourceでワイルドカードがあるPassRole |
Security Warning | Pass role with NotAction and NotResource | NotActionおよびNotResourceでPassRole |
Security Warning | Pass role with star in resource | リソースでワイルドカードがあるPassRole |
Security Warning | Pass role with star in action and resource | アクションとリソースでワイルドカードがあるPassRole |
Security Warning | Pass role with star in resource and NotAction | リソースとNotActionでワイルドカードがあるPasRole |
Suggestion | Empty array action | 空の配列・アクション |
Suggestion | Empty array condition | 空の配列・条件 |
Suggestion | Empty array condition ForAllValues | 空の配列・条件/ForAllValues |
Suggestion | Empty array condition ForAnyValue | 空の配列・条件/ForAnyValue |
Suggestion | Empty array condition IfExists | 空の配列・条件/IfExists |
Suggestion | Empty array principal | 空の配列・プリンシパル |
Suggestion | Empty array resource | 空の配列・リソース |
Suggestion | Empty object condition | 空のオブジェクト・状態 |
Suggestion | Empty object principal | 空のオブジェクト・プリンシパル |
Suggestion | Empty Sid value | 空のSid値 |
Suggestion | Improve IP range | IP範囲の改善 |
Suggestion | Null with qualifier | 修飾子でNull |
Suggestion | Private IP address subset | aws:SourceIpでプライベートIPアドレスのサブセット |
Suggestion | Private NotIpAddress subset | aws:SourceIpのNotIpAddressでプライベートIPサブセット |
Suggestion | Redundant action | 冗長なアクション |
Suggestion | Redundant condition value num | 冗長な条件値num |
Suggestion | Redundant resource | 冗長なリソース |
Suggestion | Redundant statement | 冗長なステートメント |
Suggestion | Wildcard in service name | サービス名でワイルドカードを使用 |
多くの項目が用意されていることが分かります。ポリシー編集画面上ではチェックへの対応方法も一緒に表示してくれるので、事前に難しいことを考えなくて良さそうです。
チェック例を見てみよう
冒頭で引用したブログからそのまま拝借して、どのようにチェックしてくれるかを見てみましょう。(以降の画像はすべて引用したものです。)
セキュリティチェック(PassRoleの範囲が広い)
iam:PassRole
を許可するリソースが*
で指定されている場合のチェック結果です。
必要最小限のリソースに絞ることで解消されます。
エラーチェック(Json Syntax Error)
無効な構文となっている場合に出るチェックです。ここでは不要な(
が含まれてしまっています。
構文チェックについては従来から似たようなことができましたが、より分かりやすくなりましたね。
警告チェック(無効な Date の値)
Date として YYYY-MM-DD のフォーマットを入れるべきところ、YYYY のみを指定したことにより警告されている例です。
具体的な修正内容も同じ画面で確認できるのは便利ですね。
提案チェック(空の配列アクション)
"Action"
部を配列としているが、中身が空の状態の場合のチェックです。
構文としては間違っていない場合にもこういった形で提案してくれるのは助かります。
終わりに
IAM Access Analyzer の新機能ポリシーチェックでした。
繰り返しとなりますが、この機能はアクセスアナライザーの有効化(アナライザーの作成)を行なっていなくても利用できます。単純に「 IAM ポリシーの編集画面便利になったなー」という感覚です。
今回はコンソール上での確認のみにとどめましたが、ValidatePolicy
という API も用意されています。
そのうち AWS CLI でも使用できるようになるかと思いますので、対応したら使用感を確認してみたいと思います。
以上、千葉(幸)がお送りしました。